package com.xuef.service;

import com.xuef.entity.Blog;
import com.xuef.entity.Catalog;
import com.xuef.entity.Comment;
import com.xuef.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * Created by moveb on 2018/5/7.
 */
public interface BlogService {
    /**
     * 保存Blog
     * @return
     */
    Blog saveBlog(Blog blog);

    /**
     * 删除Blog
     * @param id
     * @return
     */
    void removeBlog(int id);

    /**
     * 根据id获取Blog
     * @param id
     * @return
     */
    Blog getBlogById(int id);

    /**
     * 根据用户名进行分页模糊查询（最新）
     * @param user
     * @return
     */
    Page<Blog> listBlogsByUserAndKeywordLike(User user, String title, Pageable pageable);

    /**
     * 根据用户名进行分页模糊查询（最热）
     * @param user
     * @return
     */
    Page<Blog> listBlogsByTitleVoteAndSort(User user, String title, Pageable pageable);

    /**
     * 根据分类进行查询
     * @param catalog
     * @param pageable
     * @return
     */
    Page<Blog> listBlogsByCatalog(Catalog catalog, Pageable pageable);

    /**
     * 将博客按照年月归档
     * @param userId
     * @return
     */
    List<Object[]> getBlogCount(int userId);

    /**
     * 查询某年月博客
     * @return
     */
    Page<Blog> listBlogsByYearMonth(User user, Date start, Date end, Pageable pageable);

    /**
     * 阅读量递增
     * @param id
     */
    void readingIncrease(int id);

    /**
     * 某篇博文在redis中记录的阅读量
     * @param blogId
     * @return
     */
    int getReadCount(int blogId);
    /**
     * 发表评论
     * @return
     */
    Comment saveComment(Comment comment);

    /**
     * 获取某资源(博文，评论)的评论列表
     * @param entityType
     * @param entityId
     * @return
     */
    List<Comment> listComments(int entityType, int entityId);

    /**
     * 删除评论
     * @param blogId
     * @param commentId
     * @return
     */
    void removeComment(int blogId, int commentId);

    /**
     * 更新评论数量
     * @param blogId
     */
    void updateCommentCount(int blogId);
    /**
     * 点赞
     * @param blogId
     * @return
     */
    Blog createVote(int blogId);

    /**
     * 取消点赞
     * @param blogId
     * @param voteId
     * @return
     */
    void removeVote(int blogId, int voteId);

    Page<Blog> findByIdIn(List<Integer> blogs, Pageable pageable);
}
